﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using Sistema_Totem.Logica.Clases;
using Sistema_Totem.Logica.Excepciones;
using System.Data;

namespace Sistema_Totem.Vista.Clientes
{
    public partial class ListarConsultarCliente : System.Web.UI.Page
    {
        private string valor;
        private List<Cliente> listaCliente2;
        protected void Page_Load(object sender, EventArgs e)
        {

            //if (Session["tipo_usuario"].ToString() != "Administrador")
            //{
            //    Response.Redirect("Login1.aspx");
            //}

            if (!IsPostBack)
            {
                cargarDatos();
            }
            else
                MensajeDeTransaccion.Visible = false;
                GridViewCliente.Visible = true;

        }

        /// <summary>
         /// metodo encagado de llenar el gridview de clientes
         /// </summary>
        public void cargarDatos()
        {
             List<Cliente> formatos = ObtenerCliente();
             Session.Add("listaCliente", formatos);
             GridViewCliente.DataSource = formatos;
             GridViewCliente.DataBind();
        }

        /// <summary>
        /// metodo que consulta todos los clientes registrados
        /// </summary>
        /// <returns> se retorna la lista de clientes, para llenar el grid de cliente</returns>
        protected List<Cliente> ObtenerCliente()
        {
            List<Cliente> formatos = new List<Cliente>();
            Cliente misClientes = new Cliente();
            formatos = misClientes.ConsultarClientes();
            return formatos;
        }

        /// <summary>
        /// Metodo que hace la paginacion del gridview
        /// </summary>
        /// <param name="sender">el mismo grid</param>
        /// <param name="e"> el click sobre el icono de la pagina</param>
        protected void GridViewConsultarCliente_PageIndexChanging(object sender, GridViewPageEventArgs e)
        {
            GridViewCliente.PageIndex = e.NewPageIndex;
            GridViewCliente.DataSource = ObtenerCliente();
            GridViewCliente.DataBind();

        }

        /// <summary>
        /// Metodo encargado de hacer la redireccion a la pagina de modificar cliente, con el parametro de busqueda
        /// </summary>
        /// <param name="sender">el rif es el parametro de busqueda para un cliente</param>
        /// <param name="e">se acciona cuando se hace click en el icono de editar</param>
        protected void GridViewConsultarCliente_SelectedIndexChanged(object sender, EventArgs e)
        {
            string rif = GridViewCliente.SelectedRow.Cells[0].Text;
            Session.Add("RIF",rif);
            Response.Redirect("ConsultarCliente.aspx");
        }

        /// <summary>
        /// motor de busqueda basico para el cliente, puede buscar por RIF o NOMBRE
        /// deben ser escritos exactamente como estan registrados
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected void BuscarParametro_Click(object sender, EventArgs e)
        {
            try 
            {
                switch (Convert.ToInt32(tipoBusqueda.SelectedValue))
                {
                    //en caso de buscar por rif
                    case 1:
                        listaCliente2 = new List<Cliente>();
                        listaCliente2 = (List<Cliente>)Session["listaCliente"];
                        valor = textBuscar.Text;
                        GridViewCliente.DataSource = CargarClienteTabla2(listaCliente2, 1, valor);
                        GridViewCliente.DataBind();
                        break;
                    
                    //en caso de buscar por nombre
                    case 2:
                        listaCliente2 = new List<Cliente>();
                        listaCliente2 = (List<Cliente>)Session["listaCliente"];
                        valor = textBuscar.Text;
                        GridViewCliente.DataSource = CargarClienteTabla2(listaCliente2, 2, valor);
                        GridViewCliente.DataBind();
                        break;
                }
            }
            // en caso de ocurrir una excepcion -manejo interno del grupo
            catch (ClienteExcepcion error)
            {
                MensajeDeTransaccion.Text = error.Message;
                MensajeDeTransaccion.CssClass = "transaccionFallida";
                MensajeDeTransaccion.Visible = true;
                GridViewCliente.Visible = false;
               
            }
        }
        
        /// <summary>
        /// Metodo encargado de re-escribir el gridview de clientes
        /// </summary>
        /// <param name="listaCliente">recibe la lista de clientes</param>
        /// <param name="caso">si el caso es buscar por RIF o por NOMBRE</param>
        /// <param name="valor">el valor de comparacion a buscar dentro de la lista</param>
        /// <returns>el cliente buscado</returns>
        public List<Cliente> CargarClienteTabla2(List<Cliente> listaCliente, int caso, string valor)
        {
            //se crea una nueva lista de clientes
            List<Cliente> clienteEncontrado = new List<Cliente>();
            //si busca por RIF
            if (caso == 1)
            {
                foreach (Cliente miCliente in listaCliente)
                {
                    if (miCliente.Rif == valor)
                    {
                        clienteEncontrado.Add(miCliente);
                    }
                }
            }
            else 
            {
                //si busca por NOMBRE
                if (caso == 2)
                {
                    foreach (Cliente miCliente in listaCliente)
                    {
                        if (miCliente.Nombre == valor)
                        {
                            clienteEncontrado.Add(miCliente);
                        }
                    }
                 }
            }

            //si no encontro a nadie en la lista
             if(clienteEncontrado.Count == 0) 
             {
                 //se lanza una excepcion personalizada con un mensaje al usuario
                 throw (new ClienteExcepcion("No hay resultado para su busqueda"));
             }

            return clienteEncontrado;
        }
   
    }
}